package com.scpii.universal.util;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import net.sf.json.JSONArray;

import com.scpii.universal.dto.CatelogNode;
import com.scpii.universal.hibernate.entity.CatelogTab;

/**
 * universalWeb
 * @author liuhj
 * 2012-7-18上午11:13:46
 */
public class CatelogJsonBuilder {
	public String buildJson(List<CatelogTab> catelogs) {
		Set<CatelogNode> nodeSet = buildNodeList(catelogs);
		JSONArray jsonSet = JSONArray.fromObject(nodeSet);
		return jsonSet.toString();
	}

	private Set<CatelogNode> buildNodeList(List<CatelogTab> catelogs) {
		Set<CatelogNode> nodeSet = new HashSet<CatelogNode>();
		if (catelogs == null || catelogs.isEmpty()) {
			return nodeSet;
		}
		List<CatelogTab> notParentCatelogs = new ArrayList<CatelogTab>();
		CatelogNode node = null;
		for (int i = 0; i < catelogs.size(); i++) {
			CatelogTab catelog = catelogs.get(i);
			if (catelog.getIntParentCateId() == 0) {
				node = new CatelogNode(catelog.getIntCateId(), catelog
						.getVarCateName(), catelog.getIntParentCateId(), catelog
						.getVarCateImgUrl(), catelog.getIntHasSubCate(), catelog
						.getVarCateDescrip(), catelog.getIntType());
				//根节点
				nodeSet.add(node);
				notParentCatelogs.add(catelog);
			}
		}
		catelogs.removeAll(notParentCatelogs);
		
		for (Iterator<CatelogNode> ites = nodeSet.iterator(); ites.hasNext();) {
			//找子节点
			CatelogNode ele = ites.next();
			findChildren(ele, catelogs);
		}
		return nodeSet;
	}
	
	private void findChildren(CatelogNode parent, List<CatelogTab> catelogs) {
		CatelogNode node = null;
		for (int i = 0; i < catelogs.size(); i++) {
			CatelogTab catelogTab = catelogs.get(i);
			if (catelogTab.getIntParentCateId().intValue() == parent
					.getIntCateId().intValue()) {
				node = new CatelogNode(catelogTab.getIntCateId(), catelogTab
						.getVarCateName(), catelogTab.getIntParentCateId(),
						catelogTab.getVarCateImgUrl(), catelogTab
								.getIntHasSubCate(), catelogTab
								.getVarCateDescrip(),catelogTab.getIntType());
				parent.addChild(node);
				if (catelogTab.getIntHasSubCate().intValue() == 1) {
					// 有子节点
					findChildren(node, catelogs);
				}
			}
		}
	}
}
